import java.util.ArrayList;

public class Estatistica04 extends Estatisticas
{
	public int deltaTAtual = 1;
	public int tempoEstavel = 0;
	public double tamDelta = 100;
	double somatorioDelta = 0;
	double mediaTotal;
	double mediaDelta;
	double tempoInicioDelta = 0;
	public int quantEstavel = 0;
	public double tempoAnterior = 0;
	public double estimadorMediaMediana = 0;
	public double estimadorVarianciaMediana = 0;
	public double limiteInferior;
	public double limiteSuperior;
	public ArrayList<Par> cdfs = new ArrayList<Par>();
	boolean faseTransienteCalculada = false;

	public void calcFaseTransiente(int quantidadeUsuario, double tempoAtual)
	{
		if (tempoInicioDelta == 0) tempoInicioDelta = tempoAtual;
		if (tempoAtual - tempoInicioDelta < tamDelta)
		{
			somatorioDelta += (tempoAtual - tempoAnterior) * quantidadeUsuario;
		}
		else
		{
			mediaDelta = somatorioDelta / (tempoAtual - tempoInicioDelta);
			mediaTotal = (mediaTotal * (deltaTAtual - 1) + mediaDelta) / deltaTAtual;
			if (Math.abs(mediaDelta - mediaTotal) < 0.001)
			{
				System.out.println("Fim da fase transiente: " + tempoAtual);
				faseTransienteCalculada = true;
			}
			else
			{
				tempoEstavel = 0;
			}
			tempoInicioDelta = 0;
			somatorioDelta = 0;
			deltaTAtual++;
		}

		tempoAnterior = tempoAtual;
	}

	public double calcCdf(double x, Rodada rodadaAtual)
	{
		double quantidade = 0;
		for (Usuario u : rodadaAtual.usuarios)
		{
			if (u.getHoraSeed() != 0 && (u.getHoraSeed() - u.getHoraChegada()) < x)
			{
				quantidade++;
			}
		}
		double percento = quantidade / rodadaAtual.usuariosAtendidos;
		cdfs.add(new Par(x, percento));
		return percento;
	}

	// ====================
	public void calcMediana(Rodada rodadaAtual)
	{
		double mediana;
		if (cdfs.size() % 2 != 0)
		{
			mediana = cdfs.get((cdfs.size() + 1) / 2).tempo;
			rodadaAtual.mediana = mediana;
		}
		else
		{
			mediana = (cdfs.get((cdfs.size()) / 2).tempo + cdfs.get(((cdfs.size()) / 2) + 1).tempo) / 2;
			rodadaAtual.mediana = mediana;
		}
	}

	public void calcEstimadorMediana(ArrayList<Rodada> rodadas)
	{
		estimadorMediaMediana = 0;
		for (Rodada r : rodadas)
		{
			estimadorMediaMediana += r.mediana;
		}
		estimadorMediaMediana /= rodadas.size();
	}

	private void calcEstimadorVarianciaMediana(ArrayList<Rodada> rodadas)
	{
		estimadorVarianciaMediana = 0;
		for (Rodada r : rodadas)
		{
			estimadorVarianciaMediana += (r.mediana - estimadorMediaMediana) * (r.mediana - estimadorMediaMediana);

		}
		estimadorVarianciaMediana /= (rodadas.size() - 1);
	}

	public void calcLimites(ArrayList<Rodada> rodadas)
	{
		calcEstimadorMediana(rodadas);
		calcEstimadorVarianciaMediana(rodadas);
		calcLimiteInferior(rodadas.size());
		calcLimiteSuperior(rodadas.size());
	}

	private void calcLimiteInferior(int numeroAmostras)
	{
		limiteInferior = estimadorMediaMediana - 1.96 * Math.sqrt(estimadorVarianciaMediana) / Math.sqrt(numeroAmostras);
	}

	private void calcLimiteSuperior(int numeroAmostras)
	{
		limiteSuperior = estimadorMediaMediana + 1.96 * Math.sqrt(estimadorVarianciaMediana) / Math.sqrt(numeroAmostras);
	}
	// ===================
}
